home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / winlib.lzh / WINLIB / DISPATCH.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-03  |  6.2 KB  |  266 lines

  1. /********************************************************************
  2.  *                                                                    *
  3.  *    Dispatcher calling module                                        *
  4.  *    by Karl 0ygard and Ken Hollis                                    *
  5.  *                                                                    *
  6.  *    Copyright (c) Clever Bits and Bitgate Software 1993 - 1994        *
  7.  *    All Rights Reserved.                                            *
  8.  *                                                                    *
  9.  *    Handles windows and the dispatching of information between each    *
  10.  *    window.                                                            *
  11.  *                                                                    *
  12.  ********************************************************************
  13.  *                                                                    *
  14.  *    Update log:                                                        *
  15.  *    [12.9.93 - 24.9.93] Karl A. 0ygard                                *
  16.  *        not documented                                                *
  17.  *    [24.9.93 - 24.2.94] Ken Hollis                                    *
  18.  *        (all dispatchers) - made smarter (checks window type before    *
  19.  *                            calling a dispatcher; this assures no    *
  20.  *                            bombs in case a wrong dispatcher is        *
  21.  *                            called by mistake)                        *
  22.  *        WCallTmrDispatcher-    fixed up so calls window structures        *
  23.  *        WCallTMDDispatcher- timer mode change dispatcher added        *
  24.  *                                                                    *
  25.  ********************************************************************/
  26.  
  27. #include "winlib.h"
  28.  
  29. #ifdef __TURBOC__
  30. #pragma warn -pia
  31. #endif
  32.  
  33. void *_MainDispatcher;
  34. void *_MainKeyDispatcher;
  35.  
  36. #ifndef __DISPATCH__
  37. #define __DISPATCH__
  38. #endif
  39.  
  40. /*
  41.  *    Calls dispatcher procedures for window win, if existant
  42.  *    Returns TRUE, if dispatcher procedure didn't handle message (returned FALSE),
  43.  *        or if dispatcher procedure does not exist.
  44.  */
  45. LOCAL int WCallWndDispatcherSub(WINDOW *win, int msg_buf[], int Dispatcher(WINDOW *, int[]))
  46. {
  47.     if ((Dispatcher = win->WndDispatcher) && (win->handle > 0))
  48.         return Dispatcher(win, msg_buf) ? FALSE : TRUE;
  49.  
  50.     return TRUE;
  51. }
  52.  
  53. GLOBAL int WCallWndDispatcher(WINDOW *win, int msg_buf[])
  54. { return WCallWndDispatcherSub(win, msg_buf, WCallWndDispatcher); }
  55.  
  56. GLOBAL int WCallDlgDispatcher(WINDOW *win, int message)
  57. {
  58.     int msg_buf[8] = {WM_DIALOG, 0, 0, 0, 0, 0, 0, 0};
  59.  
  60.     if (win->state & W_DIALOG) {
  61.         msg_buf[3] = message;
  62.         return WCallWndDispatcher(win, msg_buf);
  63.     }
  64.  
  65.     return TRUE;
  66. }
  67.  
  68. GLOBAL int WCallWKeyDispatcher(WINDOW *win, int key)
  69. {
  70.     int msg_buf[8] = {WM_KEYBD, 0, 0, 0, 0, 0, 0, 0};
  71.  
  72.     if ((win->state & W_DIALOG) ||
  73.         (win->state & W_TEXT) ||
  74.         (win->state & W_DESKTOP) ||
  75.         (win->state & W_TIMER) ||
  76.         (win->state & W_FLYING)) {
  77.         msg_buf[3] = key;
  78.         return WCallWndDispatcher(win, msg_buf);
  79.     }
  80.  
  81.     return TRUE;
  82. }
  83.  
  84. GLOBAL int WCallBtnDispatcher(WINDOW *win, int mx, int my, int button, int kstate, int bclicks)
  85. {
  86.     int msg_buf[8] = {WM_BUTTON, 0, 0, 0, 0, 0, 0, 0};
  87.  
  88.     if ((win->state & W_DIALOG) ||
  89.         (win->state & W_TEXT) ||
  90.         (win->state & W_DESKTOP) ||
  91.         (win->state & W_TIMER) ||
  92.         (win->state & W_FLYING)) {
  93.         msg_buf[3] = mx;
  94.         msg_buf[4] = my;
  95.         msg_buf[5] = button;
  96.         msg_buf[6] = kstate;
  97.         msg_buf[7] = bclicks;
  98.         return WCallWndDispatcher(win, msg_buf);
  99.     }
  100.  
  101.     return TRUE;
  102. }
  103.  
  104. GLOBAL int WCallTxtDispatcher(WINDOW *win, int message)
  105. {
  106.     int msg_buf[8] = {WM_TEXT, 0, 0, 0, 0, 0, 0, 0};
  107.  
  108.     if (win->state & W_TEXT) {
  109.         msg_buf[3] = message;
  110.         return WCallWndDispatcher(win, msg_buf);
  111.     }
  112.  
  113.     return TRUE;
  114. }
  115.  
  116. GLOBAL int WCallFKeyDispatcher(WINDOW *win, int fkeynum)
  117. {
  118.     int msg_buf[8] = {WM_FKEY, 0, 0, 0, 0, 0, 0, 0};
  119.  
  120.     msg_buf[3] = fkeynum;
  121.     return WCallWndDispatcher(win, msg_buf);
  122. }
  123.  
  124. GLOBAL int WCallHelpDispatcher(WINDOW *win)
  125. {
  126.     int msg_buf[8] = {WM_HELP, 0, 0, 0, 0, 0, 0, 0};
  127.  
  128.     if ((win->state & W_DIALOG) ||
  129.         (win->state & W_TEXT) ||
  130.         (win->state & W_DESKTOP) ||
  131.         (win->state & W_TIMER) ||
  132.         (win->state & W_FLYING)) {
  133.         if ((win->state & W_DIALOG) ||
  134.             (win->state & W_FLYING))
  135.             msg_buf[3] = 1;
  136.  
  137.         if (win->state & W_DESKTOP)
  138.             msg_buf[3] = DESKTOP;
  139.  
  140.         if ((win->state & W_TEXT) ||
  141.             (win->state & W_TIMER))
  142.             msg_buf[3] = 2;
  143.  
  144.         return WCallWndDispatcher(win, msg_buf);
  145.     }
  146.  
  147.     return TRUE;
  148. }
  149.  
  150. GLOBAL int WCallUndoDispatcher(WINDOW *win)
  151. {
  152.     int msg_buf[8] = {WM_UNDO, 0, 0, 0, 0, 0, 0, 0};
  153.  
  154.     if ((win->state & W_DIALOG) ||
  155.         (win->state & W_TEXT) ||
  156.         (win->state & W_DESKTOP) ||
  157.         (win->state & W_TIMER) ||
  158.         (win->state & W_FLYING)) {
  159.         if ((win->state & W_DIALOG) ||
  160.             (win->state & W_FLYING))
  161.             msg_buf[3] = 1;
  162.  
  163.         if (win->state & W_DESKTOP)
  164.             msg_buf[3] = DESKTOP;
  165.  
  166.         if ((win->state & W_TEXT) ||
  167.             (win->state & W_TIMER))
  168.             msg_buf[3] = 2;
  169.  
  170.         return WCallWndDispatcher(win, msg_buf);
  171.     }
  172.  
  173.     return TRUE;
  174. }
  175.  
  176. GLOBAL int WCallResetDispatcher(WINDOW *win, int mode)
  177. {
  178.     int msg_buf[8] = {WM_KBRESET, 0, 0, 0, 0, 0, 0, 0};
  179.  
  180.     msg_buf[3] = mode;
  181.     return WCallWndDispatcher(win, msg_buf);
  182. }
  183.  
  184. GLOBAL int WCallHotkeyDispatcher(WINDOW *win, int key, int objnum)
  185. {
  186.     int msg_buf[8] = {WM_HOTKEY, 0, 0, 0, 0, 0, 0, 0};
  187.  
  188.     if (win->state & W_DIALOG) {
  189.         msg_buf[3] = key;
  190.         msg_buf[4] = objnum;
  191.         return WCallWndDispatcher(win, msg_buf);
  192.     }
  193.  
  194.     return(TRUE);
  195. }
  196.  
  197. GLOBAL int WCallTmrDispatcher(WINDOW *win)
  198.     int msg_buf[8] = {WM_TIMER, 0, 0, 0, 0, 0, 0, 0};
  199.  
  200.     if (win->state & W_TIMER) {
  201.         msg_buf[3] = win->handle;
  202.  
  203.         return WCallWndDispatcher(win, msg_buf);
  204.     }
  205.  
  206.     return TRUE;
  207. }
  208.  
  209. GLOBAL int WCallTMDDispatcher(WINDOW *win, int mode)
  210. {
  211.     int msg_buf[0] = {WM_TIMECHG, 0, 0, 0, 0, 0, 0};
  212.  
  213.     if (win->state & W_TIMER) {
  214.         msg_buf[3] = win->handle;
  215.         msg_buf[4] = mode;
  216.  
  217.         return WCallWndDispatcher(win, msg_buf);
  218.     }
  219.  
  220.     return TRUE;
  221. }
  222.  
  223. GLOBAL int WCallIconifyDispatcher(WINDOW *win, int mode)
  224. {
  225.     int msg_buf[0] = { 0, 0, 0, 0, 0, 0, 0};
  226.     BOOL dispret;
  227.  
  228.     if (win->state & W_FULLERICONIFIES) {
  229.         msg_buf[0] = (mode) ? WM_ICONIFIED : WM_UNICONIFIED;
  230.         msg_buf[3] = win->handle;
  231.  
  232.         dispret = WCallWndDispatcher(win, msg_buf);
  233.  
  234.         if (!dispret)
  235.             win->state &= ~W_ICONIFIED;
  236.  
  237.         return dispret;
  238.     }
  239.  
  240.     return TRUE;
  241. }
  242.  
  243. GLOBAL int WCallEtcDispatcherSub(int msg_buf[], int Dispatcher(int[]))
  244. {
  245.     if (Dispatcher = _MainDispatcher)
  246.         return Dispatcher(msg_buf) ? FALSE : TRUE;
  247.  
  248.     return TRUE;
  249. }
  250.  
  251. GLOBAL int WCallEtcDispatcher(int msg_buf[])
  252. { return WCallEtcDispatcherSub(msg_buf, WCallEtcDispatcher); }
  253.  
  254.  
  255. LOCAL int WCallKeyDispatcherSub(int key, int Dispatcher(int))
  256. {
  257.     if (Dispatcher = _MainKeyDispatcher)
  258.         return Dispatcher(key) ? FALSE : TRUE;
  259.  
  260.     return TRUE;
  261. }
  262.  
  263. GLOBAL int WCallKeyDispatcher(int key)
  264. { return WCallKeyDispatcherSub(key, WCallKeyDispatcher); }
  265.